package com.example.demo.common;
import org.springframework.util.DigestUtils;
import org.springframework.util.StringUtils;

import java.nio.charset.StandardCharsets;
import java.util.UUID;

public class PasswordUtils {
    /**
     *加盐加密
     * @param password //用户注册的时候,存储的密码
     * @return
     */
    public static String encrypt(String password){
        //1,获取盐值(UUID)
        String salt= UUID.randomUUID().toString().replace("-","");//UUID生成的是35位的,中间有"-",所以我们去掉"-",变为"",就变成32位了
        //2将盐值+密码进行MD5加密得到最终的密码
        String finalPassword=DigestUtils.md5DigestAsHex((salt+password).getBytes(StandardCharsets.UTF_8));//salt+password拼接后进行MD5
        //将盐值和最终密码返回,中间加上$进行分割,方便后面获取盐值
        return salt+"$"+finalPassword;
    }

    /**
     *加盐验证(解密)
     * @param password 待验证的密码(用户在登录页面传递来的)
     * @param dbPassword 数据库中当前用户的密码进行加密后的最终字符串=盐值+分隔符+最终密码
     * @return
     */
    public static boolean decrypt(String password, String dbPassword){
        //传递的密码,已经数据库最终密码为null或"",且数据库的最终密码长度不为65(32+32+1)代表参数有误
        if(!StringUtils.hasLength(password)||!StringUtils.hasLength(dbPassword)||dbPassword.length()!=65){
            return false;
        }
        //1,得到盐值从数据库的dbPassword中
        String[] dbPasswordArray=dbPassword.split("\\$");//$要转义-->按照$把dbPassword切分为两段,存储在数组中,0下标放的是盐值
        if (dbPasswordArray.length!=2){//切分后,应该得到两段的.没有得到,代表数据库中最终密码错误
            return false;
        }
        //盐值
        String salt = dbPasswordArray[0];//0下标就是
        //最终正确的密码(注册的时候盐值+密码拼接后进行的MD5得到的密码
        String dbFinalPassword = dbPasswordArray[1];

        //2,加密待验证的密码(登录的时候,用户传递来的密码)
        String finalPassword =DigestUtils.md5DigestAsHex((salt+password).getBytes(StandardCharsets.UTF_8));//把得到的盐值和现在的登录传递的密码进行MD5

        //3,对比
        if(finalPassword.equals(dbFinalPassword)){ //现在加盐和的密码,和注册的时候加盐后的密码一致,代表待验证密码(登录的时候传递的)正确
            return true;
        }
        return false;
    }

}
